#include "CasePause_private.h"

/* Internal */
CasePauseExt* casePause_getExt(Case* c){
	return (CasePauseExt*)caseGetExt(c);
}
List* casePause_getPersosEnPause(Case* c){
	CasePauseExt* cpe;
	
	if(caseGetType(c) != tcPause) return NULL;
	
	cpe = casePause_getExt(c);
	if(cpe == NULL) return NULL;
	
	return cpe->persosEnPause;
}

/* Constructor */
Case* newCasePause(Plateau* plateau){
	Case* c;
	
	c = newCase(plateau);
	if(c == NULL) return NULL;
	
	caseSetType(c,tcPause);
	c->executer = casePauseExecuter;
	c->executerSortie = casePauseExecuterSortie;
	
	return c;
}

/* Destructor */
int casePauseExecuter(Case* c){
	Jeu* jeu;
	Personnage* perso;

	jeu = caseGetJeu(c);
	
	jeu = newJeuCombat(jeu);
	
	if(caseGetNbPersos(c) > 1)
		listForEach(perso,caseGetPersos(c))
			jeuCombatAddCombattant(jeu,perso);
	jeuCombatExecuter(jeu);
	
	return 1;
}

int casePauseExecuterSortie(Case* c){
	/*
	 * si le perso actuel est dans la liste des persos faisant une pause sur cette case
	 * dans ce cas on ne peut rien faire pour lui => on ret 1
	 * 
	 * sinon on lui propose de faire une pause ici :p
	 * si le gars répond qu'il veut pas on retourne 1
	 * 
	 * si le gars veut, on lance un dés qui lui fait récup un pourcentage de son énergie
	 * et, évidement, on le bloque, et on retourne 1
	 */
	List* pep; /*< personnages en pause */
	Personnage* hero; /*< hero actuel */
	Joueur* joueur; /*< joueur actuel */
	int score;
	
	pep = casePause_getPersosEnPause(c);
	if(pep == NULL) return 0;
	
	hero = jeuGetHero(caseGetJeu(c));
	if(hero == NULL) return 0;
	
	if(listRem(pep,hero) != NULL)	return 1;
	
	joueur = persoGetJoueur(hero);
	if(!joueurAskFairePause(joueur)) return 1;
	
	score = desLancer10();
	/* TODO : Il faut globalement ajouteur une gestion des notifications => y réfléchir */
	
	score = score * (persoGetExperience(hero) / 20);
	persoAddVie(hero,score);
	
	return 1;
}
